//////////////////////////////////////////////////////////////////////////

#ifndef _SAVER_H_
#include "saver.h"
#endif

//////////////////////////////////////////////////////////////////////////

#ifndef _SERVERSTATEPACKET_H_
#include "serverstatepacket.h"
#endif

#ifndef _SERVERINFOPACKET_H_
#include "serverinfopacket.h"
#endif

#ifndef _CLIENTINPUTPACKET_H_
#include "clientinputpacket.h"
#endif

#ifndef _CLIENTINFOPACKET_H_
#include "clientinfopacket.h"
#endif

#ifndef _CLIENTIDPACKET_H_
#include "clientidpacket.h"
#endif

//////////////////////////////////////////////////////////////////////////


const Buffer& Saver::GetBuffer() const
{
    return m_Buffer;
}


//////////////////////////////////////////////////////////////////////////


void Saver::SavePlayer( const Player& _player )
{
    SaveObject(_player);
}


//////////////////////////////////////////////////////////////////////////


void Saver::SaveBullet( const Bullet& _bullet )
{
    SaveObject(_bullet);
}


//////////////////////////////////////////////////////////////////////////


void Saver::SaveServerState( const ServerState& _state )
{
    // Save players
    m_Buffer.WriteSize_t(_state.GetPlayers().size());
    PlayersList::const_iterator playersIt = _state.GetPlayers().begin();
    for (;playersIt != _state.GetPlayers().end(); ++playersIt)
        SavePlayer(*playersIt);

    // Save bullets
    m_Buffer.WriteSize_t(_state.GetBullets().size());
    BulletsList::const_iterator bulletsIt = _state.GetBullets().begin();
    for (;bulletsIt != _state.GetBullets().end(); ++bulletsIt)
        SaveBullet(*bulletsIt);

    // Save walls
    m_Buffer.WriteSize_t(_state.GetWalls().size());
    WallsList::const_iterator wallsIt = _state.GetWalls().begin();
    for (;wallsIt != _state.GetWalls().end(); ++wallsIt)
        SaveObject(*wallsIt);
}


//////////////////////////////////////////////////////////////////////////


void Saver::SaveObject( const GameObject& _gameObject )
{
    // Save ID
    m_Buffer.WriteInt( _gameObject.GetID() );

    // Save position
    m_Buffer.WriteFloat(_gameObject.GetPosition().x);
    m_Buffer.WriteFloat(_gameObject.GetPosition().y);
}


//////////////////////////////////////////////////////////////////////////


void Saver::SaveClientInput( const ClientInput& _clientInput )
{
    // Save actions
    m_Buffer.WriteUInt( _clientInput.GetActions() );

    // Save mouse position
    m_Buffer.WriteFloat(_clientInput.GetMousePosition().x);
    m_Buffer.WriteFloat(_clientInput.GetMousePosition().y);
}


//////////////////////////////////////////////////////////////////////////


void Saver::SavePacketCode( Packet::PacketCode _code )
{
    m_Buffer.WriteMemory( &_code, sizeof(Packet::PacketCode) );
}


//////////////////////////////////////////////////////////////////////////


void Saver::SaveTimePacket( const TimePacket& _timePacket )
{
    m_Buffer.WriteSize_t( _timePacket.GetCreationTime() );
}


//////////////////////////////////////////////////////////////////////////


void Saver::SaveClientInfoPacket( const ClientInfoPacket& _clientInfoPacket )
{
    SavePacketCode( Packet::CLIENT_INFO );
    SaveClientInfo( _clientInfoPacket.GetClientInfo() );
}


//////////////////////////////////////////////////////////////////////////


void Saver::SaveClientInputPacket( const ClientInputPacket& _clientInputPacket )
{
    SavePacketCode( Packet::CLIENT_INPUT );
    SaveTimePacket( _clientInputPacket );
    SaveClientInput( _clientInputPacket.GetClientInput() );
}


//////////////////////////////////////////////////////////////////////////


void Saver::SaveServerStatePacket( const ServerStatePacket& _serverStatePacket )
{
    SavePacketCode( Packet::SERVER_STATE );
    SaveTimePacket(_serverStatePacket);
    SaveServerState( _serverStatePacket.GetState() );
}


//////////////////////////////////////////////////////////////////////////


void Saver::SaveServerInfoPacket( const ServerInfoPacket& _serverInfoPacket )
{
    SavePacketCode( Packet::SERVER_INFO );
    SaveServerInfo( _serverInfoPacket.GetServerInfo() );
}


//////////////////////////////////////////////////////////////////////////


void Saver::SaveClientInfo( const ClientInfo& _clientInfo )
{
}


//////////////////////////////////////////////////////////////////////////



void Saver::SaveServerInfo( const ServerInfo& _serverInfo )
{
}


//////////////////////////////////////////////////////////////////////////


void Saver::SaveClientIDPacket( const ClientIDPacket& _clientIDPacket )
{
    SavePacketCode( Packet::CLIENT_ID );
    m_Buffer.WriteInt( _clientIDPacket.GetClientID() );
}

//////////////////////////////////////////////////////////////////////////
